/**
 * 百度地图经纬度转腾讯地图经纬度
 */
export function bMapTransQQMap(lng, lat) {
  // eslint-disable-next-line no-loss-of-precision
  let x_pi = (3.14159265358979324 * 3000.0) / 180.0
  let x = lng - 0.0065
  let y = lat - 0.006
  let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi)
  let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi)
  let lngs = z * Math.cos(theta)
  let lats = z * Math.sin(theta)
  return {
    lng: lngs,
    lat: lats
  }
}
/**
 * 腾讯地图经纬度转百度地图经纬度
 */
export function qqMapTransBMap(lng, lat) {
  // eslint-disable-next-line no-loss-of-precision
  let x_pi = (3.14159265358979324 * 3000.0) / 180.0
  let x = lng
  let y = lat
  let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi)
  let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi)
  let lngs = z * Math.cos(theta) + 0.0065
  let lats = z * Math.sin(theta) + 0.006
  return {
    lng: lngs,
    lat: lats
  }
}

/**
 * 计算两个经纬度之间的距离（单位：米）
 * @param {number} lat1 - 第一个点的纬度
 * @param {number} lon1 - 第一个点的经度
 * @param {number} lat2 - 第二个点的纬度
 * @param {number} lon2 - 第二个点的经度
 * @returns {number} - 两个经纬度之间的距离（单位：米）
 */
export function calculateDistance(lat1, lon1, lat2, lon2) {
  if (!(lat1 && lon1 && lat2 && lon2)) return -1
  lat1 = +lat1
  lon1 = +lon1
  lat2 = +lat2
  lon2 = +lon2
  const toRadians = (x) => (x * Math.PI) / 180
  const R = 6371e3 // 地球半径（单位：米）

  const dLat = toRadians(lat2 - lat1)
  const dLon = toRadians(lon2 - lon1)

  const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2)

  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))

  const distance = R * c // 距离（单位：米）
  return distance.toFixed(4)
}

/**
 * 格式化距离值
 * @param {number} distance - 距离值（单位：米）
 * @returns {string} - 格式化后的距离字符串
 */
export function formatDistance(distance) {
  distance = Number(distance)
  if (isNaN(distance)) return -1
  if (distance < 1000) {
    return distance.toFixed(0) + "m"
  } else if (distance < 100000) {
    const km = (distance / 1000).toFixed(1)
    return km + "km"
  } else {
    return ">100km"
  }
}
